--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_identity_switch_oracles.py
Displaying Raw • Download
tests/backend/test_identity_switch_oracles.py a96697b9a554c7ae068fb1b4a2bd19f34f918ce3 (a96697b9) Text, 11.09 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Oracle tests for identity hotswap serialization, delete eviction, and LXMF GET consistency."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787asyncio
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787contextlib Tff7b72import Te6edf3ExitStack
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3AsyncMockTb4b4b4, Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3dir_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3dir_path
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dir_pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_rnsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3real_identity_class Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentity
Tff7b72class T56d364MockIdentityClassTb4b4b4(Te6edf3real_identity_classTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffinitial_hash_32_bytes_long_01234Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffhexhash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3ExitStackTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3stackTb4b4b4:
Te6edf3patches Tff7b72= Tb4b4b4[
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.ReticulumTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.TransportTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.IdentityTa5d6ff"Tb4b4b4, Te6edf3MockIdentityClassTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffthreading.ThreadTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.DatabaseTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.ConfigManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.MessageHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.AnnounceManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.ArchiverManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.MapManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.DocsManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.NomadNetworkManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.TelephoneManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.VoicemailManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RingtoneManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNCPHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNStatusHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNProbeHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.TranslatorHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.CommunityInterfacesManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXMF.LXMRouterTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.IdentityContextTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Te6edf3mocks Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3p Tff7b72in Te6edf3patchesTb4b4b4:
Te6edf3attr_name Tff7b72= Tb4b4b4(
Te6edf3pTff7b72.Td2a8ffattribute Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3pTb4b4b4, Ta5d6ff"Ta5d6ffattributeTa5d6ff"Tb4b4b4) Tff7b72else Te6edf3pTff7b72.Td2a8fftargetTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Tb4b4b4)
Te6edf3mocksTb4b4b4[Te6edf3attr_nameTb4b4b4] Tff7b72= Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3mock_id_instance Tff7b72= Te6edf3MockIdentityClassTb4b4b4(Tb4b4b4)
Te6edf3mock_id_instanceTff7b72.Td2a8ffget_private_key Tff7b72= Te6edf3MagicMockTb4b4b4(
Te6edf3return_valueTff7b72=Ta5d6ffbTa5d6ff"Ta5d6ffinitial_private_keyTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3MockIdentityClassTb4b4b4, Ta5d6ff"Ta5d6fffrom_fileTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3mock_id_instanceTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72yield Tb4b4b4{
Ta5d6ff"Ta5d6ffIdentityTa5d6ff"Tb4b4b4: Te6edf3MockIdentityClassTb4b4b4,
Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4: Te6edf3mock_id_instanceTb4b4b4,
Ta5d6ff"Ta5d6ffIdentityContextTa5d6ff"Tb4b4b4: Te6edf3mocksTb4b4b4[Ta5d6ff"Ta5d6ffIdentityContextTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ff_write_identity_treeTb4b4b4(Te6edf3storage_dirTb4b4b4: Tffa657strTb4b4b4, Te6edf3identity_hashTb4b4b4: Tffa657strTb4b4b4, Te6edf3keyTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3identity_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3storage_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3identity_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3identity_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3keyTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_oracle_concurrent_hotswap_serializes_critical_sectionTb4b4b4(
Te6edf3mock_rnsTb4b4b4,
Te6edf3temp_dirTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Second hotswap must not enter until the first finishes (lock held across sleep)."""
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3AsyncMockTb4b4b4(Tb4b4b4)
Te6edf3hash_a Tff7b72= Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16
Te6edf3hash_b Tff7b72= Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16
Te6edf3_write_identity_treeTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3hash_aTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffkey_aTa5d6ff"Tb4b4b4)
Te6edf3_write_identity_treeTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3hash_bTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffkey_bTa5d6ff"Tb4b4b4)
Te6edf3id_a Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3id_aTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_aTb4b4b4)
Te6edf3id_b Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3id_bTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_bTb4b4b4)
Tff7b72def Td2a8fffrom_fileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3hash_a Tff7b72in Te6edf3pathTb4b4b4:
Tff7b72return Te6edf3id_a
Tff7b72if Te6edf3hash_b Tff7b72in Te6edf3pathTb4b4b4:
Tff7b72return Te6edf3id_b
Tff7b72return Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]
Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffIdentityTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3from_file
Te6edf3ctx_a Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctx_aTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffATa5d6ff"
Te6edf3ctx_aTff7b72.Td2a8ffidentity_hash Tff7b72= Te6edf3hash_a
Te6edf3ctx_b Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctx_bTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffBTa5d6ff"
Te6edf3ctx_bTff7b72.Td2a8ffidentity_hash Tff7b72= Te6edf3hash_b
Tff7b72def Td2a8ffsetup_side_effectTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3hash_aTb4b4b4:
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3ctx_a
Tff7b72elseTb4b4b4:
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3ctx_b
Te6edf3appTff7b72.Td2a8ffteardown_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffsetup_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Te6edf3setup_side_effectTb4b4b4)
Te6edf3first_in_sleep Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Te6edf3release_first Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72async Tff7b72def Td2a8ffgated_sleepTb4b4b4(Te6edf3delayTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3delay Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3first_in_sleepTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3release_firstTff7b72.Td2a8ffwaitTb4b4b4(Tb4b4b4)
Te6edf3task_b_started Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)
Tff7b72async Tff7b72def Td2a8ffrun_bTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3task_b_startedTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72await Te6edf3appTff7b72.Td2a8ffhotswap_identityTb4b4b4(Te6edf3hash_bTb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.asyncio.sleepTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Te6edf3gated_sleepTb4b4b4)Tb4b4b4:
Te6edf3task_a Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffcreate_taskTb4b4b4(Te6edf3appTff7b72.Td2a8ffhotswap_identityTb4b4b4(Te6edf3hash_aTb4b4b4)Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffwait_forTb4b4b4(Te6edf3first_in_sleepTff7b72.Td2a8ffwaitTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff2Tb4b4b4)
Te6edf3task_b Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffcreate_taskTb4b4b4(Te6edf3run_bTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffwait_forTb4b4b4(Te6edf3task_b_startedTff7b72.Td2a8ffwaitTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff2Tb4b4b4)
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.02Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3task_bTff7b72.Td2a8ffdoneTb4b4b4(Tb4b4b4)
Te6edf3release_firstTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Te6edf3results Tff7b72= Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffgatherTb4b4b4(Te6edf3task_aTb4b4b4, Te6edf3task_bTb4b4b4)
Tff7b72assert Te6edf3results Tff7b72== Tb4b4b4[Tff7b72TrueTb4b4b4, Tff7b72TrueTb4b4b4]
Tff7b72assert Te6edf3appTff7b72.Td2a8ffteardown_identityTff7b72.Td2a8ffcall_count Tff7b72== T79c0ff2
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_oracle_hotswap_broadcast_requires_reauth_when_auth_enabledTb4b4b4(
Te6edf3mock_rnsTb4b4b4,
Te6edf3temp_dirTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3auth_enabledTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3AsyncMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffteardown_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffUserTa5d6ff"
Te6edf3mock_ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffauth_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ffsetup_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3_idTb4b4b4: Tffa657setattrTb4b4b4(Te6edf3appTb4b4b4, Ta5d6ff"Ta5d6ffcurrent_contextTa5d6ff"Tb4b4b4, Te6edf3mock_ctxTb4b4b4)Tb4b4b4)
Te6edf3new_hash Tff7b72= Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16
Te6edf3_write_identity_treeTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3new_hashTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)
Te6edf3new_id Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3new_idTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3new_hashTb4b4b4)
Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffIdentityTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3new_id
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.asyncio.sleepTa5d6ff"Tb4b4b4, Te6edf3newTff7b72=Te6edf3AsyncMockTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3appTff7b72.Td2a8ffhotswap_identityTb4b4b4(Te6edf3new_hashTb4b4b4)
Te6edf3payload Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffidentity_switchedTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffrequires_reauthTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_oracle_hotswap_broadcast_no_reauth_when_auth_disabledTb4b4b4(
Te6edf3mock_rnsTb4b4b4,
Te6edf3temp_dirTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3auth_enabledTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3AsyncMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffteardown_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffUserTa5d6ff"
Te6edf3mock_ctxTff7b72.Td2a8ffconfigTff7b72.Td2a8ffauth_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffsetup_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3_idTb4b4b4: Tffa657setattrTb4b4b4(Te6edf3appTb4b4b4, Ta5d6ff"Ta5d6ffcurrent_contextTa5d6ff"Tb4b4b4, Te6edf3mock_ctxTb4b4b4)Tb4b4b4)
Te6edf3new_hash Tff7b72= Ta5d6ff"Ta5d6ffffTa5d6ff" Tff7b72* T79c0ff16
Te6edf3_write_identity_treeTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3new_hashTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)
Te6edf3new_id Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3new_idTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3new_hashTb4b4b4)
Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffIdentityTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3new_id
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.asyncio.sleepTa5d6ff"Tb4b4b4, Te6edf3newTff7b72=Te6edf3AsyncMockTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3appTff7b72.Td2a8ffhotswap_identityTb4b4b4(Te6edf3new_hashTb4b4b4)
Te6edf3payload Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3appTff7b72.Td2a8ffwebsocket_broadcastTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72assert Te6edf3payloadTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrequires_reauthTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3stale_hash Tff7b72= Ta5d6ff"Ta5d6ffccTa5d6ff" Tff7b72* T79c0ff16
Te6edf3current_hash Tff7b72= Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3stale_ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3stale_ctxTff7b72.Td2a8ffidentity_hash Tff7b72= Te6edf3stale_hash
Te6edf3appTff7b72.Td2a8ffcontextsTb4b4b4[Te6edf3stale_hashTb4b4b4] Tff7b72= Te6edf3stale_ctx
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffidentity_hash Tff7b72= Te6edf3current_hash
Te6edf3identity_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3temp_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"Tb4b4b4, Te6edf3stale_hashTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3identity_dirTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3identity_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffstaleTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3appTff7b72.Td2a8ffdelete_identityTb4b4b4(Te6edf3stale_hashTb4b4b4) Tff7b72is Tff7b72True
Te6edf3stale_ctxTff7b72.Td2a8ffteardownTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3stale_hash Tff7b72not Tff7b72in Te6edf3appTff7b72.Td2a8ffcontexts
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3identity_dirTb4b4b4)
Tff7b72def Td2a8fftest_oracle_setup_identity_drops_context_when_storage_dir_removedTb4b4b4(
Te6edf3mock_rnsTb4b4b4,
Te6edf3temp_dirTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3orphan_hash Tff7b72= Ta5d6ff"Ta5d6ffddTa5d6ff" Tff7b72* T79c0ff16
Te6edf3orphan_ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3orphan_ctxTff7b72.Td2a8ffrunning Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffcontextsTb4b4b4[Te6edf3orphan_hashTb4b4b4] Tff7b72= Te6edf3orphan_ctx
Te6edf3new_id Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3new_idTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3orphan_hashTb4b4b4)
Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffIdentityContextTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffsetup_identityTb4b4b4(Te6edf3new_idTb4b4b4)
Te6edf3orphan_ctxTff7b72.Td2a8ffteardownTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffIdentityContextTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_oracle_propagation_nodes_reads_only_ctx_databaseTb4b4b4(Te6edf3mock_rnsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rnsTb4b4b4[Ta5d6ff"Ta5d6ffid_instanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3handler Tff7b72= Tff7b72None
Tff7b72for Te6edf3route Tff7b72in Te6edf3appTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3routeTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-nodesTa5d6ff" Tff7b72and Te6edf3routeTff7b72.Td2a8ffmethod Tff7b72== Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4:
Te6edf3handler Tff7b72= Te6edf3routeTff7b72.Td2a8ffhandler
Tff7b72break
Tff7b72assert Te6edf3handler Tff7b72is Tff7b72not Tff7b72None
Te6edf3ctx Tff7b72= Te6edf3appTff7b72.Td2a8ffcurrent_context
Tff7b72assert Te6edf3ctx Tff7b72is Tff7b72not Tff7b72None
Te6edf3ctxTff7b72.Td2a8ffrunning Tff7b72= Tff7b72True
Te6edf3marker Tff7b72= Ta5d6ff"Ta5d6fforacle-marker-identityTa5d6ff"
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3markerTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffcreated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2020-01-01Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2020-01-01Ta5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_filtered_announcesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3wrong_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3wrong_dbTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwrong-wrong-wrong-wrong-wrong-wrongTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffffTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffcreated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2020-01-01Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffupdated_atTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff2020-01-01Ta5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Te6edf3router Tff7b72= Te6edf3ctxTff7b72.Td2a8ffmessage_router
Te6edf3routerTff7b72.Td2a8ffpropagation_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3hexhashTff7b72=Tff7b72NoneTb4b4b4, Tffa657hashTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Tffa657typeTb4b4b4(Te6edf3appTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Tffa657propertyTb4b4b4(Tff7b72lambda Tff7b72selfTb4b4b4: Te6edf3wrong_dbTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3request Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3requestTff7b72.Td2a8ffquery Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3requestTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Te6edf3nodes Tff7b72= Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodesTa5d6ff"Tb4b4b4]
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3nodesTb4b4b4) Tff7b72== T79c0ff1
Tff7b72assert Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3marker
Te6edf3wrong_dbTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────